#include "TElemListaMensajes.h"

int TNLM_Crear(TElemListaMensajes* elemento, TPuerto puerto, int tam_elemento) {
	elemento->tam_elemento = tam_elemento;
	elemento->puerto = puerto;
	elemento->mensajes_prioritarios = (TPila*) malloc(sizeof(TPila));
	elemento->mensajes_no_prioritarios = (TCola*) malloc(sizeof(TCola));

	Pila_Crear(elemento->mensajes_prioritarios, elemento->tam_elemento);
	Cola_Crear(elemento->mensajes_no_prioritarios, elemento->tam_elemento);

	return NLM_OK;
}

int TNLM_Destruir(TElemListaMensajes* elemento) {
	elemento->tam_elemento = -1;
	elemento->puerto = -1;

	/* TODO: cuando no se hace un recv de las placas, TMensaje->texto leakea.
	 * Hay que reemplazar los siguientes 'vaciar' por una rutina que saque todos los mensajes
	 * uno por uno y los destruya con Mensaje_Destruir */

	Pila_Vaciar(elemento->mensajes_prioritarios);
	Cola_Vaciar(elemento->mensajes_no_prioritarios);

	free(elemento->mensajes_prioritarios);
	free(elemento->mensajes_no_prioritarios);

	return NLM_OK;
}


int TNLM_ObtenerPuerto(TElemListaMensajes* elemento) {
    return (elemento->puerto);
}

int TNLM_InsertarMensajePrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_in) {
    int error;
    error =	Pila_Agregar(elemento->mensajes_prioritarios, mensaje_in);

    if (error) {
        return NLM_ERR_MEMORIA;
    }
    else {
        return NLM_OK;
    }
}

int TNLM_InsertarMensajeNoPrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_in) {
	int error;
	error = Cola_Agregar(elemento->mensajes_no_prioritarios, mensaje_in);

	if (error == COLA_ERR_MEMORIA) {
		return NLM_ERR_MEMORIA;
	}
	else {
		return NLM_OK;
	}
}

int TNLM_ObtenerMensajePrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_out) {
	int error;

	if (Pila_Vacia(elemento->mensajes_prioritarios)) {
		return NLM_ERR_NOHAYMENSAJES;
	}

	error = Pila_Sacar(elemento->mensajes_prioritarios, mensaje_out);

	if ((Pila_Vacia(elemento->mensajes_prioritarios))
		&& (Cola_Vacia(*(elemento->mensajes_no_prioritarios)))) {
		TNLM_Destruir(elemento);
	}

	return NLM_OK;
}


int TNLM_ObtenerMensajeNoPrioritario(TElemListaMensajes* elemento, TMensaje* mensaje_out) {
	int error;

	if (Cola_Vacia(*(elemento->mensajes_no_prioritarios))) {
		return NLM_ERR_NOHAYMENSAJES;
	}

	error = Cola_Sacar(elemento->mensajes_no_prioritarios, mensaje_out);

	if ((Pila_Vacia(elemento->mensajes_prioritarios))
			&& (Cola_Vacia((*elemento->mensajes_no_prioritarios)))) {
		TNLM_Destruir(elemento);
	}

	return NLM_OK;
}
